﻿using System;
using System.Collections.Generic;

/// <summary>
/// 1. 模式的结构
/// 组合模式包含以下主要角色。
/// 抽象构件（Component）角色：它的主要作用是为树叶构件和树枝构件声明公共接口，并实现它们的默认行为。在透明式的组合模式中抽象构件还声明访问和管理子类的接口；在安全式的组合模式中不声明访问和管理子类的接口，管理工作由树枝构件完成。
/// 树叶构件（Leaf）角色：是组合中的叶节点对象，它没有子节点，用于实现抽象构件角色中 声明的公共接口。
/// 树枝构件（Composite）角色：是组合中的分支节点对象，它有子节点。它实现了抽象构件角色中声明的接口，它的主要作用是存储和管理子部件，通常包含 Add()、Remove()、GetChild() 等方法。
/// </summary>
namespace Composite
{
    class Program
    {
        static void Main(string[] args)
        {
            Component c0 = new Composite();
            Component c1 = new Composite();
            Component leaf1 = new Leaf("1");
            Component leaf2 = new Leaf("2");
            Component leaf3 = new Leaf("3");
            c0.add(leaf1);
            c0.add(c1);
            c1.add(leaf2);
            c1.add(leaf3);
            c0.operation();
        }
    }
    //抽象构件
    interface Component
    {
        public void add(Component c);
        public void remove(Component c);
        public Component getChild(int i);
        public void operation();
    }
    //树叶构件
    class Leaf : Component
    {
        private String name;
        public Leaf(String name)
        {
            this.name = name;
        }
        public void add(Component c) { }
        public void remove(Component c) { }
        public Component getChild(int i)
        {
            return null;
        }
        public void operation()
        {
            Console.WriteLine("树叶" + name + "：被访问！");
        }
    }
    //树枝构件
    class Composite : Component
    {
        private List<Component> children = new List<Component>();
        public void add(Component c)
        {
            children.Add(c);
        }
        public void remove(Component c)
        {
            children.Remove(c);
        }
        public Component getChild(int i)
        {
            return children[i];
        }
        public void operation()
        {

            foreach (var obj in children)
            {
                obj.operation();
            }
        }
    }
}
